/**
 * @fileoverview Tests for checks.js.
 */
goog.module('protobuf.internal.checksTest');

const {CHECK_TYPE, checkDefAndNotNull, checkFunctionExists} = goog.require('protobuf.internal.checks');

describe('checkDefAndNotNull', () => {
    it('throws if undefined', () => {
        let value;
        if (CHECK_TYPE) {
            expect(() => checkDefAndNotNull(value)).toThrow();
        } else {
            expect(checkDefAndNotNull(value)).toBeUndefined();
        }
    });

    it('throws if null', () => {
        const value = null;
        if (CHECK_TYPE) {
            expect(() => checkDefAndNotNull(value)).toThrow();
        } else {
            expect(checkDefAndNotNull(value)).toBeNull();
        }
    });

    it('does not throw if empty string', () => {
        const value = '';
        expect(checkDefAndNotNull(value)).toEqual('');
    });
});

describe('checkFunctionExists', () => {
    it('throws if the function is undefined', () => {
        let foo = /** @type {function()} */ (/** @type {*} */ (undefined));
        if (CHECK_TYPE) {
            expect(() => checkFunctionExists(foo)).toThrow();
        } else {
            checkFunctionExists(foo);
        }
    });

    it('throws if the property is defined but not a function', () => {
        let foo = /** @type {function()} */ (/** @type {*} */ (1));
        if (CHECK_TYPE) {
            expect(() => checkFunctionExists(foo)).toThrow();
        } else {
            checkFunctionExists(foo);
        }
    });

    it('does not throw if the function is defined', () => {
        function foo(x) {
            return x;
        }

        checkFunctionExists(foo);
    });
});